# hit_keywords.py
# usage: 
# python ./src/query/hit_keywords.py --question "请问2024年2月工单服务满意率环比增长是多少？"

import os,sys
project_root = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
sys.path.insert(0, project_root)
import argparse
from utils import debug_print

def load_keywords(filepath):
    """读取 keywords.txt 并按 '|' 分割成列表"""
    if not os.path.exists(filepath):
        raise FileNotFoundError(f"Keywords file not found: {filepath}")
    
    with open(filepath, 'r', encoding='utf-8') as f:
        line = f.read().strip()
        return [kw.strip() for kw in line.split('|') if kw.strip()]

def extract_keywords_in_text(text, keywords):
    """从文本中提取出出现在 keywords 列表中的关键词"""
    found = []
    for kw in keywords:
        if kw in text:
            found.append(kw)
    return found

def hit_keywords(question, documents, debug=None):
    # Step 1: 加载关键词
    keywords_file = 'data/keywords.txt'
    keywords = load_keywords(keywords_file)
    debug_print(debug,f"[DEBUG] Loaded keywords: {keywords}")

    # Step 2: 提取问题中的关键词
    keywordInQuestion = extract_keywords_in_text(question, keywords)
    debug_print(debug,f"[DEBUG] Keywords in question: {keywordInQuestion}")

    # Step 4: 遍历每个 document，提取其中的关键词
    keywordInResults = []
    hitKeywordsNum = []

    for doc in documents:
        kws_in_doc = extract_keywords_in_text(doc, keywords)
        keywordInResults.append(kws_in_doc)
        # 计算与问题关键词的交集数量
        overlap = len(set(keywordInQuestion) & set(kws_in_doc))
        hitKeywordsNum.append(overlap)

    debug_print(debug,f"[DEBUG] Keywords in each result: {keywordInResults}")
    debug_print(debug,f"[DEBUG] Overlap counts (hitKeywordsNum): {hitKeywordsNum}")
    return hitKeywordsNum;


if __name__ == '__main__':

    parser = argparse.ArgumentParser()
    parser.add_argument('--question', type=str, required=True, help='输入的问题')
    parser.add_argument('--debug', action='store_true', help='启用调试模式，显示详细日志。')
    args = parser.parse_args()

    question = args.question
#    documents = ['{\n  "name": "专题区市县工单日表",\n  "table": "sub_area_total_day",\n  "DDL": "CREATE TABLE sub_area_total_day (\\n    md_id INTEGER PRIMARY KEY AUTOINCREMENT COMMENT \'自增主键\',\\n    busi_time TEXT COMMENT \'业务时间(格式：yyyy-MM-dd 业务说明：字段最小粒度到日，如果进行月度和年度统计，需要进行汇总或平均计算）\',\\n    sub_name TEXT COMMENT \'专题名称(交通运输|公卫医疗|农林牧渔|城乡建设|科教文体)\',\\n    area TEXT COMMENT \'区市县单位(A区|B区|C区|D区|E区|F区|G区|H区|I区)\',\\n    order_cnt INTEGER COMMENT \'工单量\',\\n    finish_cnt INTEGER COMMENT \'办结量\',\\n    avg_handler_time REAL COMMENT \'平均处理时长\',\\n    satisfaction_cnt INTEGER COMMENT \'工单满意数\',\\n    negative_cnt INTEGER COMMENT \'工单差评数\',\\n    reply_on_time_cnt INTEGER COMMENT \'按时回复数\'\\n);",\n  "questions": [\n    "公卫医疗专题各区县分别接收了多少工单？",\n    "公卫医疗专题各区县分别办结了多少工单？",\n    "公卫医疗专题各区县平均处理时长分别是多少？",\n    "公卫医疗专题各区县平均满意率分别是多少？",\n    "公卫医疗专题各区县差评数分别是多少？",\n    "公卫医疗专题各区县按时回复率分别是多少？"\n  ]\n}', '{\n  "name": "专题办件效能分析日表\\n(各主题各区县工单量、办结量、平均处理时长、满意度)",\n  "table": "sub_monitor_total_day",\n  "DDL": "CREATE TABLE sub_monitor_total_day (\\n    md_id INTEGER PRIMARY KEY AUTOINCREMENT COMMENT \'自增主键\',\\n    busi_time TEXT COMMENT \'业务时间(格式：yyyy-MM-dd 业务说明：字段最小粒度到日，如果进行月度和年度统计，需要进行汇总或平均计算）\',\\n    sub_name TEXT COMMENT \'专题名称(交通运输|公卫医疗|农林牧渔|城乡建设|科教文体)\',\\n    type_name TEXT COMMENT \'排行类型(字段约束只能为1和2，其中1表示市直部门,2表示区市县\',\\n    name TEXT COMMENT \'名称（单位名称、区县名称）(B部门|C部门|A部门|A区|B区|C区)\',\\n    item_num INTEGER COMMENT \'工单量\',\\n    complete_cnt INTEGER COMMENT \'按时办结量\',\\n    avg_handler_time INTEGER COMMENT \'平均处理时长(min)\',\\n    satisfaction_cnt INTEGER COMMENT \'服务满意数\'\\n);",\n  "questions": [\n    "公卫医疗专题各市直部门办理的工单量是多少？",\n    "公卫医疗专题各市直部门办结率分别是多少？",\n    "公卫医疗专题各市直部门平均处理时长分别是多少？",\n    "公卫医疗专题各市直部门服务满意率分别是多少？",\n    "公卫医疗专题各区县办理的工单量是多少？",\n    "公卫医疗专题各区县按时办结率分别是多少？",\n    "公卫医疗专题各区县平均处理时长分别是多少？",\n    "公卫医疗专题各区县服务满意率分别是多少？"\n  ]\n}', '{\n  "name": "专题工单类型分析",\n  "table": "sub_type_total_day",\n  "DDL": "CREATE TABLE sub_type_total_day (\\n    md_id INTEGER PRIMARY KEY AUTOINCREMENT COMMENT \'自增主键\',\\n    busi_time TEXT COMMENT \'业务时间(格式：yyyy-MM-dd 业务说明：字段最小粒度到日，如果进行月度和年度统计，需要进行汇总或平均计算）\',\\n    sub_name TEXT COMMENT \'专题名称（交通运输|公卫医疗|农林牧渔|城乡建设|科教文体）\',\\n    type_name TEXT COMMENT \'工单类型（举报|其他|咨询|意见建议|投诉|无效|求助|表扬）\',\\n    type_cnt INTEGER COMMENT \'工单量\',\\n    finish_cnt INTEGER COMMENT \'按时办结量\',\\n    satisfaction_cnt INTEGER COMMENT \'工单满意数\',\\n    avg_handler_time REAL COMMENT \'平均处理时长\'\\n);",\n  "questions": [\n    "公卫医疗专题咨询类工单的平均需要处理多长时间？",\n    "公卫医疗专题咨询类工单的平均满意率是多少？",\n    "公卫医疗专题咨询类工单的工单量有多少？",\n    "公卫医疗专题咨询类工单的按时办结率是多少？",\n    "公卫医疗专题投诉类工单的平均需要处理多长时间？",\n    "公卫医疗专题投诉类工单的平均满意率是多少？",\n    "公卫医疗专题投诉类工单的工单量有多少？",\n    "公卫医疗专题投诉类工单的按时办结率是多少？",\n    "公卫医疗专题意见建议类工单的平均需要处理多长时间？",\n    "公卫医疗专题意见建议类工单的平均满意率是多少？",\n    "公卫医疗专题意见建议类工单的工单量有多少？",\n    "公卫医疗专题意见建议类工单的按时办结率是多少？",\n    "公卫医疗专题求助类工单的平均需要处理多长时间？",\n    "公卫医疗专题求助类工单的平均满意率是多少？",\n    "公卫医疗专题求助类工单的工单量有多少？",\n    "公卫医疗专题求助类工单的按时办结率是多少？",\n    "公卫医疗专题表扬类工单的平均需要处理多长时间？",\n    "公卫医疗专题表扬类工单的平均满意率是多少？",\n    "公卫医疗专题表扬类工单的工单量有多少？",\n    "公卫医疗专题表扬类工单的按时办结率是多少？",\n    "公卫医疗专题举报类工单的平均需要处理多长时间？",\n    "公卫医疗专题举报类工单的平均满意率是多少？",\n    "公卫医疗专题举报类工单的工单量有多少？",\n    "公卫医疗专题举报类工单的按时办结率是多少？"\n  ]\n}']
    # 定义文件夹路径
    folder_path = './sql_output'
    # 初始化 documents 列表
    documents = []
    # 遍历文件夹中所有以 .json 结尾的文件
    for filename in os.listdir(folder_path):
        if filename.endswith('.json'):
            file_path = os.path.join(folder_path, filename)
            # 读取文件内容
            with open(file_path, 'r', encoding='utf-8') as file:
                content = file.read()
            # 删除内容中的换行符，并去除首尾空白
            cleaned_content = content.replace('\n', '').replace('\r', '').strip()
            # 添加到 documents 列表
            documents.append(cleaned_content)

    # 输出结果（可选）
    print("documents =", documents)

    hit_keywords(question,documents,args.debug)
    
